/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "屏幕.h"

#include "工作区/库视口/库视口工作区.h"
#include "工作区/3D工作区/3D视口工作区.h"
#include "工作区/2D视口/2D视口工作区.h"
#include "工作区/文本视口/ui文本页面.h"
#include "工作区/节点视口/节点视口工作区.h"
#include "工作区/时间轴视口/曲线视口工作区.h"
#include "工作区/时间轴视口/轴视口工作区.h"
#include "工作区/渲染器视口/渲染器视口工作区.h"
#include "工作区/表格视口/表格工作区.h"
#include "工作区/设置窗口/设置视口工作区.h"



#include "工作区/节点操作.h"
#include "工作区/工作区弹出菜单.h"

#include "物体编辑/物体编辑.h"
#include <core/时间.h>


static C_Widget* g页面添加菜单 = nullptr;
static C_Widget* g当前多页面 = nullptr;
//static C_Widget管理* gm


static bool f_平面页面标签结束拖动(C_Widget* self, C_Widget* 拾取的部件, S_拖放数据& data) {
	switch (data.m_Type) {
	case E_自定义拖放数据类型::e_拖放_节点子集按钮 : {
		std::cout << "拾取的部件:" << data.m_Type << std::endl;
		C_工作区页面* 工作区 = f_屏幕_create工作区页面(*(self->m_UIctx), E_工作区类型::e_材质节点视口);
		if (工作区) {
			f_屏幕_添加工作区页面(self, 工作区, true);
			f_曲线视口工作区_设置当前编辑节点();
		}

		break;
	}
	default:
		break;
	}
	return true;
}


//C_Widget* on_Widget添加回调(C_Widget* r, uint32 当前同级组件数量) {
//	return nullptr;
//}
static bool on_Widget添加回调(C_Widget* self, const E_鼠标按钮& 按钮) {
	g当前多页面 = self->m_父部件;

	f_ui_打开菜单(g页面添加菜单, self->m_GlobalLoc);
	return true;
}


C_工作区页面* f_屏幕_create工作区页面(S_UI创建环境& ctx, E_工作区类型 type, E_方向 方向) {
	C_工作区页面* 工作区 = nullptr;

	switch (type) {
	case e_库: {
		工作区 = f_工作区页面_创建库视口(ctx);
		工作区->m_WName = L"库";
		break;
	}

	case e_3D视口: {
		工作区 = f_工作区页面_3D视口create(ctx);
		工作区->m_WName = L"3D视口";
		break;
	}

	case E_工作区类型::e_曲线视口: {
		工作区 = f_工作区页面_曲线视口create(ctx);
		工作区->m_WName = L"曲线视口";
		break;
	}

	case e_视频纹理: {
		break;
	}

	case e_时间轴: {
		工作区 = f_工作区_时间轴视口create(ctx);
		工作区->m_WName = L"时间轴";
		break;
	}

	case e_节点视口: {
		工作区 = f_工作区_create节点视口(ctx);
		工作区->m_WName = L"节点1";
		break;
	}

	case e_材质节点视口: {
		工作区 = f_工作区_create材质节点视口(ctx);
		工作区->m_WName = L"材质1";
		break;
	}

	case e_渲染合成视口: {
		工作区 = f_工作区页面_创建渲染器视口(ctx);
		工作区->m_WName = L"渲染合成";
		break;
	}

	case E_工作区类型::e_2D视口: {
		工作区 = f_工作区_创建2D视口(ctx);
		工作区->m_WName = L"2D视口";
		break;
	}

	case E_工作区类型::e_表格视口: {
		工作区 = f_工作区_创建表格视口(ctx);
		工作区->m_WName = L"表格";
		break;
	}

	case E_工作区类型::e_文本编辑视口: {
		工作区 = f_工作区_创建文本编辑视口(ctx);
		工作区->m_WName = L"文本编辑";
		break;
	}

	case E_工作区类型::e_设置视口: {
		工作区 = f_工作区_创建设置视口(ctx);
		工作区->m_WName = L"设置";
		break;
	}

	default:
		break;
	}

	//工作区->m_工作区类型 = type;
	return 工作区;
}






static std::map<std::wstring, E_工作区类型> g工作区类型名称;



static void on_菜单项点击(C_Widget* self, const std::wstring name, uint16 id) {
	C_工作区页面* 工作区 = nullptr;

	

	if (g工作区类型名称.find(name) != g工作区类型名称.end()) {
		E_工作区类型 type = g工作区类型名称[name];

		工作区 = f_屏幕_create工作区页面(*(g当前多页面->m_UIctx), type);
		if (工作区) {
			f_屏幕_添加工作区页面(g当前多页面, 工作区, true);
			f_曲线视口工作区_设置当前编辑节点();
		}
	}

	/*switch (id) {
	case 0: type = E_工作区类型::e_3D视口; break;
	case 1: type = E_工作区类型::e_节点视口; break;
	case 2: type = E_工作区类型::e_曲线视口; break;
	case 3: type = E_工作区类型::e_时间轴; break;
	case 4: type = E_工作区类型::e_材质节点视口; break;
	case 5: type = E_工作区类型::e_渲染合成视口; break;
	case 6: type = E_工作区类型::e_文本编辑视口; break;
	default:
		return;
	}*/
}





void f_屏幕_初始化工作区(C_Widget* root, S_UI创建环境& ctx) {
	f_node_环境初始化();
	f_node_set默认操作数据(S_框架::g_Scene, *S_框架::g_3D视口环境);
	//f_node_创建虚拟体网格物体(*S_框架::g_3D视口环境, E_物体类型::t_空);
	
	g工作区类型名称[DEF_3D视口工作区] = E_工作区类型::e_3D视口;
	g工作区类型名称[DEF_库视口工作区] = E_工作区类型::e_库;
	g工作区类型名称[DEF_节点视口工作区] = E_工作区类型::e_节点视口;
	g工作区类型名称[DEF_曲线视口工作区] = E_工作区类型::e_曲线视口;
	g工作区类型名称[DEF_时间视口工作区] = E_工作区类型::e_时间轴;
	g工作区类型名称[DEF_材质视口工作区] = E_工作区类型::e_材质节点视口;
	g工作区类型名称[DEF_2D视口工作区]   = E_工作区类型::e_2D视口;
	//g工作区类型名称[DEF_非编视口工作区] = E_工作区类型::e_非编视口;
	g工作区类型名称[DEF_渲染视口工作区] = E_工作区类型::e_渲染合成视口;
	g工作区类型名称[DEF_表格视口工作区] = E_工作区类型::e_表格视口;
	g工作区类型名称[DEF_设置视口工作区] = E_工作区类型::e_设置视口;

	//std::vector<uint8> Keys;
	//Keys.push_back(S_InputKey::e_KEY_左ALT);
	//Keys.push_back(S_InputKey::e_KEY_A);
	//f_ui_注册全局快捷键(Keys, f_工作区_播放时间帧);
	//Keys.clear();
	S_键盘键位映射 快捷键 = {};
	快捷键.event = f_工作区_播放时间帧;
	快捷键.键盘按键[0] = S_InputKey::e_KEY_左ALT;
	快捷键.键盘按键[3] = S_InputKey::e_KEY_A;
	快捷键.键盘状态[0] = DEF_按键状态_按下中 | DEF_按键状态_放开;
	快捷键.键盘状态[3] = DEF_按键状态_放开;
	f_ui_注册全局快捷键(快捷键);

	

	S_菜单创建参数 参数 = {
		on_菜单项点击,
		{
			{DEF_3D视口工作区,		"三角细分"},
			{DEF_库视口工作区,		"image_text"},
			{DEF_节点视口工作区,	"二叉树"},
			{DEF_曲线视口工作区,	"曲线顶点"},
			{DEF_时间视口工作区,	"playback_reload"},
			{DEF_材质视口工作区,	"05_关照多维材质"},
		    {DEF_2D视口工作区,      "font-451"},
		    {DEF_非编视口工作区,	"indent_increase"},
		    {DEF_渲染视口工作区,	"layers_1"},
		    {DEF_表格视口工作区,	"分割"},
			{DEF_UI构建视口工作区,	"app_window_black"},
			{DEF_代码视口工作区,    "image_text"},
		}
	};
	g页面添加菜单 = f_ui_创建菜单(E_方向::e_纵向, 参数, ctx);

	
	//f_工作区弹出菜单_init(ctx);
	f_工作区页面_3D视口界面初始化(ctx);
	f_工作区页面_物体节点工作区初始化(ctx);
	f_工作区页面_渲染合成节点工作区初始化(ctx);
	f_工作区页面_库工作区初始化(ctx);
	f_工作区页面_曲线视口初始化(ctx);
	f_工作区页面_设置视口初始化(ctx);

	S_节点数据状态::g_骨骼编辑模式.m_UI->m_Update = f_OE_骨骼编辑模式切换;

}

void f_屏幕_开始更新工作区() {
	//更新控制柄
	vec3 pos = f_global_get激活物体中心点();
	//S_框架::g_变换手柄->f_set位置(pos);

}

void f_屏幕_更新工作区() {
//f_表格视口页面_联动更新();
	if (f_node_销毁物体()) {
		S_节点数据::g_选中激活物体.clear();
	}



	switch (S_光追后端::g_渲染状态) {
		case E_离线渲染状态::e_光追渲染_单帧:
		case E_离线渲染状态::e_光追渲染_序列: {
			break;
		}
		default: {
			f_NodeCtx_get默认场景()->f_Update(nullptr);
			f_工作区_时间步进();
			f_NodeOps_更新独立显示节点();
			f_3D视口工作区_更新视口();


			static int64 time = 0;
			float32 时间差 = time_当前时间差(time);
			if (时间差 > 33) {
				f_属性栏_刷新属性绘制();
				time = time_开始计时();
			}

			
			break;
		}
	}

	return;

	auto& frame = f_NodeCtx_get帧();
	switch (S_光追后端::g_渲染状态) {
	case E_离线渲染状态::e_光追渲染_单帧:
		S_节点数据::g_渲染帧编号 = f_prop_I32(frame.当前帧);
		f_NodeCtx_set场景当前时间(S_节点数据::g_渲染帧编号);
		S_节点数据::g_开启节点帧更新 = true;

		//f_NodeCtx_get默认场景()->f_Update(nullptr);
		f_node_Step节点树();
		S_光追后端::g_渲染状态 = E_离线渲染状态::e_光追渲染_关;
		//std::cout<<"S_框架::g_渲染状态"<<f_prop_I32(frame.当前帧)<<std::endl;
		break;

	case E_离线渲染状态::e_光追渲染_序列: {
		
		auto 区间 = f_prop_iVec2(frame.帧区间);
		if (S_节点数据::S_节点数据::g_渲染帧编号 > 区间.y) {
			S_光追后端::g_渲染状态 = E_离线渲染状态::e_光追渲染_关;
		}
		else {
			f_NodeCtx_set场景当前时间(S_节点数据::g_渲染帧编号);

			S_节点数据::g_开启节点帧更新 = true;
			f_node_Step节点树();
			++S_节点数据::g_渲染帧编号;
		}
		break;
	}
	default: {
		f_工作区_时间步进();

		f_NodeOps_更新独立显示节点();

		f_3D视口工作区_更新视口();
	}
	}


	
}


C_Widget* f_屏幕_创建工作区(S_UI创建环境& ctx, E_方向 方向) {
	std::vector<C_Widget*> ws;
	auto* 多页面窗口 = f_ui_创建多页面(ctx, 方向, ws);
	多页面窗口->m_TypeName = "工作区";
	多页面窗口->mf_结束拖拽 = f_平面页面标签结束拖动;

	if (方向 == E_方向::e_横向) {
		f_ui_设置多页面头(多页面窗口, { 80, 20 });
	}
	else {
		f_ui_设置多页面头(多页面窗口, { 20, 20 });
	}

	f_ui_set多页面添加事件(多页面窗口, on_Widget添加回调, { 20,20 });
	
	return 多页面窗口;
}

void f_屏幕_添加工作区页面(C_Widget* 屏幕, C_工作区页面* page, bool 设置为当前页面) {
	uint32 id = f_ui_多页面添加页面(屏幕, page);
	if (设置为当前页面) {
		f_ui_set多页面当前页面(屏幕, id);
	}

	屏幕->m_绘制属性更新 = true;
}









